#include <iostream>
#include <map>
#include <functional>

int minus(int a, int b)
{
    return a - b;
}

class Add
{
public:
    int operator()(int a, int b) // 仿函数：重载小括号
    {                            // 具有更好的扩展性和封装性
        return a - b;
    }
};

int main()
{
    // []:捕获列表:获取上下文中的变量
    // 值捕获：以右值形式捕获变量值
    // &：引用捕获
    // =: 以值捕获所有变量
    // ():函数参数列表
    // {}:函数主体
    // 自动推导返回值类型
    // 本质就是仿函数
    // int b = 20;
    // int count = 10;
    // auto f = [&,count](int a)
    // {
    //     b++;
    //     // count++;  // 用引用捕获可以修改
    //     std::cout << count << " " << a << " " << "lambda\n";
    //     return 20;
    // };
    // f(10);
    auto f = [](int a){std::cout<<a<<" "<<"lambda\n";};
    f(10);
    Add a;
    // 函数对象:融合三种对函数的调用形式，形成统一的格式
    // std::function<void(int, int)> f = [](int a, int b)
    // { return a * b ; };
    // std::cout << f(1, 2) << std::endl;

    std::map<char, std::function<int(int, int)>> m;
    m['+'] = a;
    m['-'] = minus;
    m['*'] = [](int a, int b){ return a * b; };
    m['/'] = [](int a, int b){ return a / b; };
    
    // 工厂
    // map替代switch 多分支：注册机
    char c = '+';
    std::cout << m[c](1, 2) << std::endl;

    return 0;
}







